Public Sub Initialize()
' Control is passed to this module once all of the Descriptor information has been collected
' This module displays the information in a form as similar as Chapter 3 as possible
Call ClearDisplay
Call ParseDescriptors
' Determine which Class Descriptor, if any, is in Column 5
Display_Descriptors.Show
End Sub
Private Sub ClearDisplay()
For i% = 0 To 4
Call DisplayNames(i%)
Choice(i%).Clear
Choice(i%).AddItem "Display Names"
Choice(i%).ListIndex = 0
Next i%
End Sub
Private Sub ParseDescriptors()
DeviceCount = 0: ConfigurationCount = 0: InterfaceCount = 0: EndpointCount = 0: ClassCount = 0
Index& = 1
Do While DescriptorData(Index&) <> 0
Select Case DescriptorData(Index& + 1) ' What TYPE of descriptor is this?
Case 1
DeviceCount = DeviceCount + 1: Choice(0).AddItem "Display Values"
Choice(0).ItemData(Choice(0).ListCount - 1) = Index&
Case 2
ConfigurationCount = ConfigurationCount + 1: Choice(1).AddItem "Configuration " & ConfigurationCount
Choice(1).ItemData(Choice(1).ListCount - 1) = Index&
Case 3
If StringCount <> 0 Then Choice(5).AddItem "String " & TwoHexCharacters$(CByte(StringCount)) & " = " & GetString$(Index&)
StringCount = StringCount + 1
Case 4
InterfaceCount = InterfaceCount + 1
Choice(2).AddItem "Interface " & ConfigurationCount & ":" & InterfaceCount
Choice(2).ItemData(Choice(2).ListCount - 1) = Index&
Case 5
EndpointCount = EndpointCount + 1
Choice(3).AddItem "Endpoint " & ConfigurationCount & ":" & EndpointCount
Choice(3).ItemData(Choice(3).ListCount - 1) = Index&
Case Else ' Must be a Class Descriptor
ClassCount = ClassCount + 1
Choice(4).AddItem "Class(" & TwoHexCharacters$(CByte(DescriptorData(Index& + 1))) & ") " & ConfigurationCount & ":" & ClassCount
Choice(4).ItemData(Choice(4).ListCount - 1) = Index&
End Select
Index& = Index& + DescriptorData(Index&)
Loop
' Fill out the default data for the Descriptors
For i% = 0 To 4
If Choice(i%).ListCount = 1 Then ' descriptor type is not present, remove from display
Choice(i%).Visible = False: Descriptor(i%).Visible = False
Else ' fill with data
Choice(i%).ItemData(0) = Choice(i%).ItemData(1)
Call AddDescriptorData(i%, 0)
End If
Next i%
If StringCount = 0 Then Choice(5).Visible = False
End Sub
Private Function GetString$(Index&) ' Extract UNICODE string from Descriptor
Length& = DescriptorData(Index&) - 2
temp$ = "": For i& = 2 To Length& + 1 Step 2: temp$ = temp$ + Chr$(DescriptorData(Index& + i&)): Next i&
GetString$ = temp$
End Function
Private Sub Descriptor_Click(DescriptorID%)
' If a user clicks on a TEXT entry then this text is replaced with it's current VALUE
Selection& = Descriptor(DescriptorID%).ListIndex
Descriptor(DescriptorID%).List(Selection&) = TwoHexCharacters(Descriptor(DescriptorID%).ItemData(Selection&))
End Sub
Private Sub Choice_Click(DescriptorID%)
' If a user changes the SELECTION then the corresponding Descriptor DISPLAY must be updated
If DescriptorID% <> 5 Then
Selection& = Choice(DescriptorID%).ListIndex
If Selection& = 0 Then
Call DisplayNames(DescriptorID%)
Call AddDescriptorData(DesciptorID%, 0)
Else
Call AddDescriptorData(DescriptorID%, Selection&)
Call DisplayDescriptor(DescriptorID%, Selection&)
End If 'Selection& = 0
End If 'DescriptorID% <> 5
End Sub
Public Sub AddDescriptorData(DescriptorID%, Selection&)
' This subroutine updates the ITEMDATA of DISPLAY with the corresponding VALUES
Index& = Choice(DescriptorID%).ItemData(Selection&)
Length& = Descriptor(DescriptorID%).ListCount
For i& = 0 To Length& - 1
Descriptor(DescriptorID%).ItemData(i&) = DescriptorData(Index& + i&)
Next i&
End Sub
Public Sub DisplayDescriptor(DescriptorID%, Selection&)
' This subroutine replaces Descriptor TEXT with Descriptor VALUES
Length& = Descriptor(DescriptorID%).ListCount
For i& = 0 To Length& - 1
Descriptor(DescriptorID%).List(i&) = TwoHexCharacters$(Descriptor(DescriptorID%).ItemData(i&))
Next i&
End Sub
Public Sub DisplayNames(DescriptorID%)
' This subroutine clears the Descriptor then copies TEXT to the DISPLAY
Descriptor(DescriptorID%).Clear
Descriptor(DescriptorID%).AddItem " Length"
Descriptor(DescriptorID%).AddItem " Type"
Select Case DescriptorID%
Case 0 'Device
Descriptor(0).AddItem " USB"
Descriptor(0).AddItem " Version"
Descriptor(0).AddItem " Class"
Descriptor(0).AddItem " SubClass"
Descriptor(0).AddItem " Protocol"
Descriptor(0).AddItem " EP0_Size"
Descriptor(0).AddItem " Vendor"
Descriptor(0).AddItem " ID"
Descriptor(0).AddItem " Product"
Descriptor(0).AddItem " ID"
Descriptor(0).AddItem " Version"
Descriptor(0).AddItem " Number"
Descriptor(0).AddItem " iManufacturer"
Descriptor(0).AddItem " iProductName"
Descriptor(0).AddItem " iSerial#"
Descriptor(0).AddItem " Configurations"
Case 1 'Configuration
Descriptor(1).AddItem " Total"
Descriptor(1).AddItem " Length"
Descriptor(1).AddItem " Interfaces"
Descriptor(1).AddItem " ThisConfig."
Descriptor(1).AddItem " ConfigName"
Descriptor(1).AddItem " Attributes"
Descriptor(1).AddItem " Max.Power"
Case 2 'Interface
Descriptor(2).AddItem " ThisInterface"
Descriptor(2).AddItem " Alternate"
Descriptor(2).AddItem " Endpoints"
Descriptor(2).AddItem " Class"
Descriptor(2).AddItem " SubClass"
Descriptor(2).AddItem " Protocol"
Descriptor(2).AddItem " InterfaceName"
Case 3 'Endpoint
Descriptor(3).AddItem " ThisEndpoint"
Descriptor(3).AddItem " Attributes"
Descriptor(3).AddItem " Max. Packet"
Descriptor(3).AddItem " Size"
Descriptor(3).AddItem " Polling Interval"
Case 4 ' Class. Display will depend upon which Class
' x = Descriptor(4).ItemData(1) 'Type
' Select Case x
' Case 33 'HID
Descriptor(4).AddItem "Param3"
Descriptor(4).AddItem "Param4"
Descriptor(4).AddItem "Param5"
Descriptor(4).AddItem "Param6"
Descriptor(4).AddItem "Param7"
Descriptor(4).AddItem "Param8"
Descriptor(4).AddItem "Param9"
' End Select
End Select
End Sub